const Koa = require('koa')
const json = require('koa-json')
const cors = require('koa2-cors')
const views = require('koa-views')
const logger = require('koa-logger')
const onerror = require('koa-onerror')
const enforceHttps = require('koa-sslify')
const bodyparser = require('koa-bodyparser')
/*实例化*/
const app = new Koa()
/*配置文件*/
var config = require('./config')
/*工具类*/
const logUtil = require('./utils/log_util')
/*通路由*/
const index = require('./routes/index')
/*类路由*/
const main = require('./routes/main')

/*错误处理程序*/
onerror(app)

/*中间件*/
/*强制转换https*/
if(config.env === 'production') {
app.use(enforceHttps({
  trustProtoHeader: true
}))
}
/*跨域允许*/
app.use(cors());
/*解析数据类型*/
app.use(bodyparser({
  enableTypes: ['json', 'form', 'text']
}))
/*打印响应*/
app.use(json())
/*打印日志*/
app.use(logger())

/*静态文件托管*/
app.use(require('koa-static')(__dirname + '/public'))
/*模板引擎*/
app.use(views(__dirname + '/public'))

/*添加格式化处理响应结果的中间件，在添加路由之前调用*/
app.use(async(ctx, next) => {
  //先去执行路由
  await next();
  //如果有返回数据，将返回数据添加到data中
  if(ctx.body) {
    if(ctx.originalUrl.indexOf('main') > 0) {
      ctx.body = {
        code: 1,
        message: 'success',
        data: ctx.body
      }
    }
  } else {
    ctx.body = {
      code: 0,
      message: 'error'
    }
  }
})

/*日志打印*/
app.use(async(ctx, next) => {
  //响应开始时间
  const start = new Date();
  //开始进入到下一个中间件
  await next();
  //响应间隔时间
  var ms;
  try {
    ms = new Date() - start;
    //记录响应日志
    logUtil.logResponse(ctx, ms);

  } catch(error) {

    ms = new Date() - start;
    //记录异常日志
    logUtil.logError(ctx, error, ms);
  }

})

/*通路由*/
app.use(index.routes(), index.allowedMethods())
/*类路由*/
app.use(main.routes(), main.allowedMethods())

/*错误处理*/
app.on('error', (err, ctx) => {
  console.error('server error', err, ctx)
});

module.exports = app